Libraries:

library(tidyverse)
library(readr)
library(rvest)
library(stats)
library(readxl)
library(dplyr)
library(stringr)
library(ggplot2)
library(ggthemes)
library(stringr)
library(data.table)
library(geojsonio)
library(leaflet)
library(rgdal)
library(haven)
library(stargazer)

Data:

Model 3:

First making a graph of annual GDP highs and lows – maybe a temporary proxy for recessions?

Annual enrollment graph:

Join enrollment data and gdp data to create linear model test:

Graph it?

College Proximity Question 5/3: (Reading in Ivy’s data)

cz <- read_dta('cz.dta')
Error in read_dta("cz.dta") : could not find function "read_dta"

Read in/create mobility data: (Trends in Mobility: Commuting Zone Intergenerational Mobility Estimates by Birth Cohort) https://opportunityinsights.org/data/?geographic_level=101&topic=0&paper_id=0#resource-listing

Read in geojson file:

Commuting zones on the map () are in 1990s format. They need to be converted so our post-2000 data can be connected to the shapefiles: (https://www.ers.usda.gov/data-products/commuting-zones-and-labor-market-areas/)

Making the map actually display data:

cz.geo %>%
  leaflet() %>%
  addTiles() %>%
  addPolygons(fillColor = ~colors1(cz.geo@data$ncollege),
              weight = 1,
              color = "white",
              opacity = 0.5,
              fillOpacity = .7) %>%
  setView(-96, 37.8, 3) %>%
  addLegend(pal = colors1,
            values = cz.geo@data$ncollege,
            title = "Number of Colleges in Commuting Zone")
Some values were outside the color scale and will be treated as NA

Try to run some lms:

Ivy’s STATA code:

foreach x of varlist ncollege nfouryr nfouryrpriv npub nelite hascollege{
    
foreach y of varlist kfr_pooled_pooled_p1 kfr_pooled_pooled_p25 kfr_pooled_pooled_p50 kfr_pooled_pooled_p75 kfr_pooled_pooled_p100 {
    reg `y' `x' popdensity2010 med_hhinc2016, r 
    outreg2 using `x'_kfr, excel append ctitle(`y')
}

Variables of interest:

as.formula(paste0(yvar1, " ~ ", paste0(xvars1, collapse =  " + ")))
kfr_pooled_pooled_p1 ~ ncollege + nfouryr + nfouryrpriv + npub + 
    nelite + hascollege + popdensity2010 + med_hhinc2016

testing?

stargazer(lm.kfr_p1,
          type = "text",
          dep.var.labels = c("kfr_pooled_pooled_p1"))
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed

===============================================
                        Dependent variable:    
                    ---------------------------
                                kfr            
-----------------------------------------------
ncollege                       0.003           
                              (0.004)          
                                               
nfouryr                       0.007*           
                              (0.004)          
                                               
nfouryrpriv                  -0.012***         
                              (0.004)          
                                               
npub                         -0.011***         
                              (0.004)          
                                               
nelite                         0.006           
                              (0.005)          
                                               
hascollege                   -0.049***         
                              (0.006)          
                                               
popdensity2010              -0.0001***         
                             (0.00001)         
                                               
med_hhinc2016               0.00000***         
                             (0.00000)         
                                               
Constant                     0.251***          
                              (0.012)          
                                               
-----------------------------------------------
Observations                    741            
R2                             0.281           
Adjusted R2                    0.273           
Residual Std. Error      0.062 (df = 732)      
F Statistic           35.756*** (df = 8; 732)  
===============================================
Note:               *p<0.1; **p<0.05; ***p<0.01

nelite on kfr at different levels

htmtable.nelite <- stargazer(nelite.p1, nelite.p25, nelite.p50, nelite.p75, nelite.p100,
          type = "html",
          dep.var.labels = c("Bottom 1%", "25%", "50%", "75%", "Top 1%"),
          out = "nelitetable.html")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed

<table style="text-align:center"><tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="5"><em>Dependent variable:</em></td></tr>
<tr><td></td><td colspan="5" style="border-bottom: 1px solid black"></td></tr>
<tr><td style="text-align:left"></td><td>Bottom 1%</td><td>25%</td><td>50%</td><td>75%</td><td>Top 1%</td></tr>
<tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td><td>(5)</td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">nelite</td><td>-0.004</td><td>-0.002</td><td>-0.001</td><td>0.001</td><td>0.004</td></tr>
<tr><td style="text-align:left"></td><td>(0.003)</td><td>(0.003)</td><td>(0.002)</td><td>(0.002)</td><td>(0.003)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">popdensity2010</td><td>-0.0001<sup>***</sup></td><td>-0.0001<sup>***</sup></td><td>-0.00004<sup>***</sup></td><td>-0.00002<sup>***</sup></td><td>-0.00000</td></tr>
<tr><td style="text-align:left"></td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">med_hhinc2016</td><td>0.00000<sup>***</sup></td><td>0.00000<sup>***</sup></td><td>0.00000<sup>***</sup></td><td>0.00000</td><td>-0.00000<sup>***</sup></td></tr>
<tr><td style="text-align:left"></td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">Constant</td><td>0.221<sup>***</sup></td><td>0.350<sup>***</sup></td><td>0.471<sup>***</sup></td><td>0.585<sup>***</sup></td><td>0.770<sup>***</sup></td></tr>
<tr><td style="text-align:left"></td><td>(0.012)</td><td>(0.010)</td><td>(0.009)</td><td>(0.009)</td><td>(0.009)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>741</td><td>741</td><td>741</td><td>741</td><td>741</td></tr>
<tr><td style="text-align:left">R<sup>2</sup></td><td>0.141</td><td>0.104</td><td>0.055</td><td>0.016</td><td>0.030</td></tr>
<tr><td style="text-align:left">Adjusted R<sup>2</sup></td><td>0.137</td><td>0.100</td><td>0.051</td><td>0.012</td><td>0.026</td></tr>
<tr><td style="text-align:left">Residual Std. Error (df = 737)</td><td>0.068</td><td>0.057</td><td>0.050</td><td>0.047</td><td>0.053</td></tr>
<tr><td style="text-align:left">F Statistic (df = 3; 737)</td><td>40.261<sup>***</sup></td><td>28.387<sup>***</sup></td><td>14.380<sup>***</sup></td><td>4.096<sup>***</sup></td><td>7.651<sup>***</sup></td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="5" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
</table>

image print cheeeeck:

tables %>%
  ggplot() +
  geom_bar(stat = "identity") +
  geom_image(aes(image = picture),
             size = .2)
Error: geom_bar requires the following missing aesthetics: x, y

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogImVjb240MDEgZmluYWwgcHJvamVjdCBSIE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KTGlicmFyaWVzOg0KYGBge3IgbGlicmFyaWVzLCByZXN1bHRzID0gIm1hcmt1cCJ9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGdlb2pzb25pbykNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkocmdkYWwpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpgYGANCg0KRGF0YToNCmBgYHtyIGRhdGEsIGluY2x1ZGUgPSBGQUxTRX0NCiMgR0RQIHVwIHRvIEZlYiAyMDIwDQojIGh0dHBzOi8vaWhzbWFya2l0LmNvbS9wcm9kdWN0cy91cy1tb250aGx5LWdkcC1pbmRleC5odG1sDQpnZHAuaW5kZXguZGF0YSA8LSByZWFkeGw6OnJlYWRfeGxzeCgnVVMtTW9udGhseS1HRFAtSGlzdG9yeS1EYXRhLnhsc3gnLCBzaGVldCA9IDMpDQpnZHAuaW5kZXggPC0gZ2RwLmluZGV4LmRhdGENCmNvbG5hbWVzKGdkcC5pbmRleClbMV0gPC0gIllfTSINCnllYXIubW9udGggPC0gc3RyX3NwbGl0X2ZpeGVkKGdkcC5pbmRleCRZX00sICcgLSAnLCAyKQ0KY29sbmFtZXMoeWVhci5tb250aCkgPC0gYygnWWVhcicsICdNb250aCcpDQpnZHAuaW5kZXggPC0gY2JpbmQoeWVhci5tb250aCwgZ2RwLmluZGV4WywgLTFdKQ0KZ2RwLmFubnVhbCA8LSBnZHAuaW5kZXggJT4lDQogIGdyb3VwX2J5KFllYXIpICU+JQ0KICBzdW1tYXJpemUoTWF4R0RQID0gbWF4KGBNb250aGx5IFJlYWwgR0RQIEluZGV4YCksDQogICAgICAgICAgICBNaW5HRFAgPSBtaW4oYE1vbnRobHkgUmVhbCBHRFAgSW5kZXhgKSkNCg0KIyBodHRwczovL25jZXMuZWQuZ292L3Byb2dyYW1zL2RpZ2VzdC9kMTgvdGFibGVzL2R0MThfMzA2LjEwLmFzcA0KZW5yb2xsbWVudC5kYXRhIDwtIHJlYWRfeGxzKCd0YWJuMzA2LjEwLnhscycpDQplbnJvbGxtZW50IDwtIGVucm9sbG1lbnQuZGF0YVsxOjEyXQ0KIyBlbnJvbGxtZW50IGlzIGluIHRob3VzYW5kcw0KZW5yb2xsbWVudCA8LSBlbnJvbGxtZW50Wy1jKDEsIDMsIDE1LCAyNywgMzksIDUxLCA2MywgNzUsIDk5LCAxMTEsIDEyMywgMTM1OjEzOSksIF0NCmNvbDEgPC0gZGF0YS5mcmFtZShzdHJfcmVtb3ZlX2FsbChlbnJvbGxtZW50W1sxXV0sICdcXC4nKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KY29sMVsyLCAxXSA8LSAiQWxsX1N0dWRlbnRzIg0KZW5yb2xsbWVudCA8LSBjYmluZChjb2wxLCBlbnJvbGxtZW50WywgLTFdKQ0KZW5yb2xsbWVudCA8LSB0KGVucm9sbG1lbnQpDQpyb3duYW1lcyhlbnJvbGxtZW50KSA8LSBjKCkNCmNvbG5hbWVzKGVucm9sbG1lbnQpIDwtIGVucm9sbG1lbnRbMSwgXQ0KZW5yb2xsbWVudCA8LSBkYXRhLmZyYW1lKGVucm9sbG1lbnQpDQpjb2xuYW1lcyhlbnJvbGxtZW50KVsxXSA8LSAnWWVhcicNCmVucm9sbG1lbnQgPC0gZW5yb2xsbWVudFstMSwgXQ0KWWVhcnMgPC0gYXMubnVtZXJpYyhzdHJfZXh0cmFjdChlbnJvbGxtZW50JFllYXIsICJbOmRpZ2l0Ol17NH0iKSkNCmVucm9sbG1lbnQgPC0gY2JpbmQoWWVhcnMsIGVucm9sbG1lbnRbLCAtMV0pDQplbnJvbGxtZW50IDwtIGRhdGEuZnJhbWUobGFwcGx5KGVucm9sbG1lbnQsIGZ1bmN0aW9uKHgpeyANCiAgZ3N1YigiLS0tIiwgTkEsIHgpDQp9KSkNCnN0cihlbnJvbGxtZW50KQ0KDQplbnJvbGxtZW50MSA8LSBlbnJvbGxtZW50WywgMToyXQ0KZ2RwLmFubnVhbDEgPC0gZ2RwLmFubnVhbA0KYWxsLnN0dWRlbnRzIDwtIGFzLm51bWVyaWMoZW5yb2xsbWVudFs0OjExLCAyXSkNCg0KZ2RwLmFubnVhbCRZZWFyIDwtIGFzLmZhY3RvcihnZHAuYW5udWFsJFllYXIpDQplbnJvbGxtZW50MSRZZWFycyA8LSBhcy5mYWN0b3IoZW5yb2xsbWVudDEkWWVhcnMpDQplbnJvbGxtZW50MSRBbGxfU3R1ZGVudHMgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZW5yb2xsbWVudDEkQWxsX1N0dWRlbnRzKSkNCmBgYA0KDQpNb2RlbCAzOg0KDQogIEZpcnN0IG1ha2luZyBhIGdyYXBoIG9mIGFubnVhbCBHRFAgaGlnaHMgYW5kIGxvd3MgLS0gbWF5YmUgYSB0ZW1wb3JhcnkgcHJveHkgZm9yIHJlY2Vzc2lvbnM/DQpgYGB7ciBncmFwaDEsIGluY2x1ZGUgPSBGQUxTRX0NCmdkcC5hbm51YWwgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsDQogICAgICAgICAgICAgICAgIHkgPSBNYXhHRFAsDQogICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBNaW5HRFAsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkgKw0KICB5bGFiKCdSZWFsIEdEUCcpDQpgYGANCg0KICBBbm51YWwgZW5yb2xsbWVudCBncmFwaDoNCmBgYHtyIGdyYXBoMiwgaW5jbHVkZSA9IEZBTFNFfQ0KZW5yb2xsbWVudDEgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IFllYXJzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gQWxsX1N0dWRlbnRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IDEpKSArDQogIHRoZW1lX2Vjb25vbWlzdCgpICsNCiAgeWxhYignRW5yb2xsbWVudCcpDQpgYGANCg0KICBKb2luIGVucm9sbG1lbnQgZGF0YSBhbmQgZ2RwIGRhdGEgdG8gY3JlYXRlIGxpbmVhciBtb2RlbCB0ZXN0Og0KYGBge3IgbG0xLCBpbmNsdWRlID0gRkFMU0V9DQp0ZXN0IDwtIGlubmVyX2pvaW4oZW5yb2xsbWVudDEsIGdkcC5hbm51YWwxLA0KICAgICAgICAgIGJ5ID0gYygiWWVhcnMiID0gIlllYXIiKSkNCg0KbG0xIDwtIGxtKEFsbF9TdHVkZW50cyB+IE1heEdEUCwNCiAgICAgICAgICBkYXRhID0gdGVzdCwNCiAgICAgICAgICBuYS5hY3Rpb24gPSBuYS5vbWl0KQ0Kc3VtbWFyeShsbTEpDQpgYGANCg0KICBHcmFwaCBpdD8NCmBgYHtyIGdyYXBoM180LCBpbmNsdWRlID0gRkFMU0V9DQp0ZXN0ICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fbGluZShhZXMoeCA9IFllYXJzLA0KICAgICAgICAgICAgICAgICB5ID0gQWxsX1N0dWRlbnRzLA0KICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkgKw0KICB5bGFiKCdFbnJvbGxtZW50IGJ5IEFsbCBTdHVkZW50cycpDQoNCnRlc3QgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gWWVhcnMsDQogICAgICAgICAgICAgICAgIHkgPSBNYXhHRFAsDQogICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgIyBnZW9tX2FibGluZShzbG9wZSA9IDAuODAxNSwgaW50ZXJjZXB0ID0gNjMxNi43MjA3KSArDQogIHRoZW1lX2Vjb25vbWlzdCgpDQpgYGANCg0KQ29sbGVnZSBQcm94aW1pdHkgUXVlc3Rpb24gNS8zOg0KKFJlYWRpbmcgaW4gSXZ5J3MgZGF0YSkNCmBgYHtyIHJlYWQgcHJveGltaXR5IGRhdGEsIHJlc3VsdHMgPSAibWFya3VwIn0NCiMgY3pfY29sbGVnZSA8LSByZWFkX2R0YSgiY3pfY29sbGVnZS5kdGEiKQ0KY3ogPC0gcmVhZF9kdGEoJ2N6LmR0YScpDQojIGNvbGxlZ2VzIDwtIHJlYWRfZHRhKCdjb2xsZWdlcy5kdGEnKQ0KIyBtb2JpbGl0eS5yZXN1bHRzIDwtIHJlYWRfeGxzeCgnbW9iaWxpdHlfcmVzdWx0cy54bHN4JykNCmBgYA0KDQpSZWFkIGluL2NyZWF0ZSBtb2JpbGl0eSBkYXRhOg0KKFRyZW5kcyBpbiBNb2JpbGl0eTogQ29tbXV0aW5nIFpvbmUgSW50ZXJnZW5lcmF0aW9uYWwgTW9iaWxpdHkgRXN0aW1hdGVzIGJ5IEJpcnRoIENvaG9ydCkNCmh0dHBzOi8vb3Bwb3J0dW5pdHlpbnNpZ2h0cy5vcmcvZGF0YS8/Z2VvZ3JhcGhpY19sZXZlbD0xMDEmdG9waWM9MCZwYXBlcl9pZD0wI3Jlc291cmNlLWxpc3RpbmcNCmBgYHtyIG1vYmlsaXR5IGRhdGEsIGluY2x1ZGU9RkFMU0V9DQojIG1vYmlsaXR5LmRhdGEgPC0gcmVhZF94bHMoJ29ubGluZWRhdGExX3RyZW5kcy54bHMnKQ0KIyBjb2xuYW1lcyhtb2JpbGl0eS5kYXRhKSA8LSBtb2JpbGl0eS5kYXRhWzE1LCBdDQojIG1vYmlsaXR5IDwtIG1vYmlsaXR5LmRhdGFbLWMoMToxNiksIF0NCiMgbW9iaWxpdHkuMTk4NiA8LSBtb2JpbGl0eSAlPiUNCiMgICBmaWx0ZXIoYEJpcnRoIENvaG9ydGAgPT0gMTk4NikNCiMgbW9iaWxpdHkuMTk4NiRgQ29tbXV0aW5nIFpvbmVgIDwtIGFzLm51bWVyaWMobW9iaWxpdHkuMTk4NiRgQ29tbXV0aW5nIFpvbmVgKQ0KIyBjei5tb2JpbGl0eS5kYXRhIDwtIGZ1bGxfam9pbihtb2JpbGl0eS4xOTg2WywgYygxLCAzOjgpXSwNCiMgICAgICAgICAgICAgICAgICAgY3osDQojICAgICAgICAgICAgICAgICAgIGJ5ID0gYyhgQ29tbXV0aW5nIFpvbmVgID0gJ2N6JykpDQojIA0KIyBjei5tb2JpbGl0eSA8LSBjei5tb2JpbGl0eS5kYXRhWywgYygxOjgsIDIxMzI6MjEzNyldDQojIGN6Lm1vYmlsaXR5IDwtIGN6Lm1vYmlsaXR5WywgYygxLCA4LCA5OjE0LCAzOjcsIDIpXQ0KIyB3cml0ZV9jc3YoY3oubW9iaWxpdHksICdjei5tb2JpbGl0eS5jc3YnKQ0KY3oubW9iaWxpdHkgPC0gcmVhZF9jc3YoJ2N6Lm1vYmlsaXR5LmNzdicpDQpgYGANCg0KUmVhZCBpbiBnZW9qc29uIGZpbGU6DQpgYGB7ciBnZW9qc29ufQ0KY3ouZ2VvanNvbiA8LSBnZW9qc29uX3JlYWQoImN6MTk5MC5qc29uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQgPSAic3AiKQ0KIyBWaWV3KGN6Lmdlb2pzb25AZGF0YSkNCiMgY3ouZ2VvanNvbiAlPiUNCiMgICBsZWFmbGV0KCkgJT4lDQojICAgI2FkZFRpbGVzKCkgJT4lDQojICAgYWRkUG9seWdvbnMoKSAlPiUNCiMgICBzZXRWaWV3KC05NiwgMzcuOCwgMykNCmBgYA0KDQpDb21tdXRpbmcgem9uZXMgb24gdGhlIG1hcCAoY3ouZ2VvanNvbkBkYXRhKSBhcmUgaW4gMTk5MHMgZm9ybWF0LiBUaGV5IG5lZWQgdG8gYmUgY29udmVydGVkIHNvIG91ciBwb3N0LTIwMDAgZGF0YSBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBzaGFwZWZpbGVzOg0KKGh0dHBzOi8vd3d3LmVycy51c2RhLmdvdi9kYXRhLXByb2R1Y3RzL2NvbW11dGluZy16b25lcy1hbmQtbGFib3ItbWFya2V0LWFyZWFzLykNCmBgYHtyIGN6IHNoYXBlIGNvbWJpbmUsIGluY2x1ZGUgPSBGQUxTRX0NCiMgY3ouY29udmVyc2lvbnMgPC0gcmVhZF94bHMoJ2N6MDBfZXF2X3YxLnhscycpDQojIGN6LmNvbnZlcnNpb25zIDwtIGN6LmNvbnZlcnNpb25zWywgYygyOjQpXQ0KIyBjei5jb252ZXJzaW9ucyRgQ29tbXV0aW5nIFpvbmUgSUQsIDE5OTBgIDwtIGFzLm51bWVyaWMoY3ouY29udmVyc2lvbnMkYENvbW11dGluZyBab25lIElELCAxOTkwYCkNCiMgY3ouY29udmVyc2lvbnMkYENvbW11dGluZyBab25lIElELCAxOTgwYCA8LSBhcy5udW1lcmljKGN6LmNvbnZlcnNpb25zJGBDb21tdXRpbmcgWm9uZSBJRCwgMTk4MGApDQojIGNvbG5hbWVzKGN6LmNvbnZlcnNpb25zKVsyXSA8LSAnY3oxOTkwJw0KIyBjb2xuYW1lcyhjei5jb252ZXJzaW9ucylbMV0gPC0gJ2N6MjAwMCcNCiMgY29sbmFtZXMoY3ouY29udmVyc2lvbnMpWzNdIDwtICdjejE5ODAnDQojIA0KIyBoZWFkKGN6Lmdlb2pzb25AZGF0YSkNCiMgY3ouZ2VvIDwtIGN6Lmdlb2pzb24NCiMgY29sbmFtZXMoY3oubW9iaWxpdHkpWzFdIDwtICdjejE5OTAnDQojIA0KIyBjei5nZW9AZGF0YSA8LSBmdWxsX2pvaW4oY3ouZ2VvQGRhdGEsDQojICAgICAgICAgICAgICAgICAgIGN6LmNvbnZlcnNpb25zWywgLTNdLA0KIyAgICAgICAgICAgICAgICAgICBieSA9IGMoJ2N6JyA9ICdjejE5OTAnKSkNCiMgY3ouZ2VvQGRhdGEgPC0gbGVmdF9qb2luKGN6Lmdlb0BkYXRhLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY3oubW9iaWxpdHksDQojICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoJ2N6JyA9ICdjejE5OTAnKSkNCiMgDQojIGN6LmdlbyAlPiUNCiMgICBsZWFmbGV0KCkgJT4lDQojICAgYWRkUG9seWdvbnMoKSAlPiUNCiMgICBzZXRWaWV3KC05NiwgMzcuOCwgMykNCg0KIyBnZW9qc29uX3dyaXRlKGN6LmdlbywNCiMgICAgICAgICAgICAgICBmaWxlID0gImN6X2dlby5nZW9qc29uIiwNCiMgICAgICAgICAgICAgICBvdmVyd3JpdGUgPSBUUlVFKQ0KDQpjei5nZW8gPC0gZ2VvanNvbl9yZWFkKCJjel9nZW8uZ2VvanNvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICB3aGF0ID0gInNwIikNCmBgYA0KDQpNYWtpbmcgdGhlIG1hcCBhY3R1YWxseSBkaXNwbGF5IGRhdGE6DQpgYGB7cn0NCmJpbnMxIDwtIGMoMSwgNSwgMTAsIDIwLCA0MCwgNjAsIDkwKQ0KICAgICAgICANCmNvbG9yczEgPC0gY29sb3JCaW4oYmlucyA9IGJpbnMxLA0KICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIllsT3JSZCIsDQogICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGN6Lmdlb0BkYXRhJG5jb2xsZWdlKQ0KICAgICAgICANCmN6LmdlbyAlPiUNCiAgbGVhZmxldCgpICU+JQ0KICBhZGRUaWxlcygpICU+JQ0KICBhZGRQb2x5Z29ucyhmaWxsQ29sb3IgPSB+Y29sb3JzMShjei5nZW9AZGF0YSRuY29sbGVnZSksDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsDQogICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwNCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDAuNSwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAuNykgJT4lDQogIHNldFZpZXcoLTk2LCAzNy44LCAzKSAlPiUNCiAgYWRkTGVnZW5kKHBhbCA9IGNvbG9yczEsDQogICAgICAgICAgICB2YWx1ZXMgPSBjei5nZW9AZGF0YSRuY29sbGVnZSwNCiAgICAgICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBDb2xsZWdlcyBpbiBDb21tdXRpbmcgWm9uZSIpDQoNCg0KYGBgDQoNCg0KVHJ5IHRvIHJ1biBzb21lIGxtczoNCg0KICBJdnkncyBTVEFUQSBjb2RlOg0KDQogICAgZm9yZWFjaCB4IG9mIHZhcmxpc3QgbmNvbGxlZ2UgbmZvdXJ5ciBuZm91cnlycHJpdiBucHViIG5lbGl0ZSBoYXNjb2xsZWdlew0KICAgIAkNCiAgICBmb3JlYWNoIHkgb2YgdmFybGlzdCBrZnJfcG9vbGVkX3Bvb2xlZF9wMSBrZnJfcG9vbGVkX3Bvb2xlZF9wMjUga2ZyX3Bvb2xlZF9wb29sZWRfcDUwIGtmcl9wb29sZWRfcG9vbGVkX3A3NSBrZnJfcG9vbGVkX3Bvb2xlZF9wMTAwIHsNCiAgICAJcmVnIGB5JyBgeCcgcG9wZGVuc2l0eTIwMTAgbWVkX2hoaW5jMjAxNiwgciANCiAgICAJb3V0cmVnMiB1c2luZyBgeCdfa2ZyLCBleGNlbCBhcHBlbmQgY3RpdGxlKGB5JykNCiAgICB9DQogICAgDQogIFZhcmlhYmxlcyBvZiBpbnRlcmVzdDoNCiAgDQpgYGB7cn0NCnl2YXIxIDwtICJrZnJfcG9vbGVkX3Bvb2xlZF9wMSINCnh2YXJzMSA8LSBjKCJuY29sbGVnZSIsICJuZm91cnlyIiwgIm5mb3VyeXJwcml2IiwgIm5wdWIiLCAibmVsaXRlIiwgImhhc2NvbGxlZ2UiLCAicG9wZGVuc2l0eTIwMTAiLCAibWVkX2hoaW5jMjAxNiIpDQpjejEgPC0gY3pbLCBjKHl2YXIxLCB4dmFyczEpXQ0KDQpsbS5tb2RlbDEgPC0gYXMuZm9ybXVsYShwYXN0ZTAoeXZhcjEsICIgfiAiLCBwYXN0ZTAoeHZhcnMxLCBjb2xsYXBzZSA9ICAiICsgIikpKQ0KDQpgYGANCg0KdGVzdGluZz8NCmBgYHtyfQ0KbG0ua2ZyX3AxIDwtIGxtKGxtLm1vZGVsMSwNCiAgICAgICAgICAgICAgICBkYXRhID0gY3opDQpzdW1tYXJ5KGxtLmtmcl9wMSkNCg0Kc3RhcmdhemVyKGN6MSwgdHlwZSA9ICJ0ZXh0IiwgdGl0bGU9IkRlc2NyaXB0aXZlIHN0YXRpc3RpY3MiLCBkaWdpdHM9MSwgb3V0PSJ0YWJsZTEudHh0IikNCg0Kc3RhcmdhemVyKGxtLmtmcl9wMSwNCiAgICAgICAgICB0eXBlID0gInRleHQiLA0KICAgICAgICAgIGRlcC52YXIubGFiZWxzID0gYygia2ZyX3Bvb2xlZF9wb29sZWRfcDEiKSkNCiAjICAgICAgICAgICwNCiAjICAgICAgICAgIGNvdmFyaWF0ZS5sYWJlbHMgPSBjKCJHcm9zcyBob3JzZXBvd2VyIiwgIlJlYXIgYXhsZSByYXRpbyIsIkZvdXIgZm93YXJkIGdlYXJzIiwNCiAjICJGaXZlIGZvcndhcmQgZ2VhcnMiLCJUeXBlIG9mIHRyYW5zbWlzc2lvbiAobWFudWFsPTEpIiksIG91dD0ibW9kZWxzLnR4dCIpDQoNCg0KYGBgDQoNCm5lbGl0ZSBvbiBrZnIgYXQgZGlmZmVyZW50IGxldmVscw0KYGBge3J9DQp5dmFyLnAxIDwtICJrZnJfcG9vbGVkX3Bvb2xlZF9wMSINCnl2YXIucDI1IDwtICJrZnJfcG9vbGVkX3Bvb2xlZF9wMjUiDQp5dmFyLnA1MCA8LSAia2ZyX3Bvb2xlZF9wb29sZWRfcDUwIg0KeXZhci5wNzUgPC0gImtmcl9wb29sZWRfcG9vbGVkX3A3NSINCnl2YXIucDEwMCA8LSAia2ZyX3Bvb2xlZF9wb29sZWRfcDEwMCINCnh2YXJzLm5lbGl0ZSA8LSBjKCJuZWxpdGUiLCAicG9wZGVuc2l0eTIwMTAiLCAibWVkX2hoaW5jMjAxNiIpDQpsbS5uZWxpdGUucDEgPC0gYXMuZm9ybXVsYShwYXN0ZTAoeXZhci5wMSwgIiB+ICIsIHBhc3RlMCh4dmFycy5uZWxpdGUsIGNvbGxhcHNlID0gICIgKyAiKSkpDQpsbS5uZWxpdGUucDI1IDwtIGFzLmZvcm11bGEocGFzdGUwKHl2YXIucDI1LCAiIH4gIiwgcGFzdGUwKHh2YXJzLm5lbGl0ZSwgY29sbGFwc2UgPSAgIiArICIpKSkNCmxtLm5lbGl0ZS5wNTAgPC0gYXMuZm9ybXVsYShwYXN0ZTAoeXZhci5wNTAsICIgfiAiLCBwYXN0ZTAoeHZhcnMubmVsaXRlLCBjb2xsYXBzZSA9ICAiICsgIikpKQ0KbG0ubmVsaXRlLnA3NSA8LSBhcy5mb3JtdWxhKHBhc3RlMCh5dmFyLnA3NSwgIiB+ICIsIHBhc3RlMCh4dmFycy5uZWxpdGUsIGNvbGxhcHNlID0gICIgKyAiKSkpDQpsbS5uZWxpdGUucDEwMCA8LSBhcy5mb3JtdWxhKHBhc3RlMCh5dmFyLnAxMDAsICIgfiAiLCBwYXN0ZTAoeHZhcnMubmVsaXRlLCBjb2xsYXBzZSA9ICAiICsgIikpKQ0KbmVsaXRlLnAxIDwtIGxtKGxtLm5lbGl0ZS5wMSwgY3opDQpuZWxpdGUucDI1IDwtIGxtKGxtLm5lbGl0ZS5wMjUsIGN6KQ0KbmVsaXRlLnA1MCA8LSBsbShsbS5uZWxpdGUucDUwLCBjeikNCm5lbGl0ZS5wNzUgPC0gbG0obG0ubmVsaXRlLnA3NSwgY3opDQpuZWxpdGUucDEwMCA8LSBsbShsbS5uZWxpdGUucDEwMCwgY3opDQp0eHR0YWJsZS5uZWxpdGUgPC0gc3RhcmdhemVyKG5lbGl0ZS5wMSwgbmVsaXRlLnAyNSwgbmVsaXRlLnA1MCwgbmVsaXRlLnA3NSwgbmVsaXRlLnAxMDAsDQogICAgICAgICAgdHlwZSA9ICJ0ZXh0IiwNCiAgICAgICAgICB0aXRsZSA9ICJUaGUgRWZmZWN0IG9mIEVsaXRlIENvbGxlZ2VzIGluIENvbW11dGluZyBab25lIG9uIHRoZSBQcm9iYWJpbGl0eSB0aGF0IGEgQ2hpbGQgZnJvbSB0aGUgMjB0aCBQZXJjZW50aWxlIEZhbGxzIGluIEVhY2ggSW5jb21lIFBlcmNlbnRpbGUgYXMgYW4gQWR1bHQiLA0KICAgICAgICAgIGRlcC52YXIuY2FwdGlvbiA9ICJQYXJlbnQgSW5jb21lIFBlcmNlbnRpbGUiLA0KICAgICAgICAgIGRlcC52YXIubGFiZWxzID0gYygiQm90dG9tIDElIiwgIjI1JSIsICI1MCUiLCAiNzUlIiwgIlRvcCAxJSIpLA0KICAgICAgICAgICMgbm90ZXMgPSAiV2hlcmUgbmVsaXRlIGlzIHRoZSBudW1iZXIgb2YgZWxpdGUgY29sbGVnZXMgaW4gY29tbXV0aW5nIHpvbmUgKGN6KSwgcG9wZGVuc2l0eTIwMTAgaXMgdGhlIGN6J3MgcG9wdWx0aW9uIGRlbnNpdHksIGFuZCBtZWRfaGhpbmMyMDE2IGlzIHRoZSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBpbiBjeiBpbiAyMDE2LiIsDQogICAgICAgICAgIyBub3Rlcy5hcHBlbmQgPSBUUlVFLA0KICAgICAgICAgICMgbm90ZXMuYWxpZ24gPSAibCIsDQogICAgICAgICAgb3V0ID0gIm5lbGl0ZXRhYmxlLnR4dCIpDQpodG10YWJsZS5uZWxpdGUgPC0gc3RhcmdhemVyKG5lbGl0ZS5wMSwgbmVsaXRlLnAyNSwgbmVsaXRlLnA1MCwgbmVsaXRlLnA3NSwgbmVsaXRlLnAxMDAsDQogICAgICAgICAgdHlwZSA9ICJodG1sIiwNCiAgICAgICAgICBkZXAudmFyLmxhYmVscyA9IGMoIkJvdHRvbSAxJSIsICIyNSUiLCAiNTAlIiwgIjc1JSIsICJUb3AgMSUiKSwNCiAgICAgICAgICBvdXQgPSAibmVsaXRldGFibGUuaHRtbCIpDQpzdW1tYXJ5KGxtLm5lbGl0ZS5wMSkNCmBgYA0KaW1hZ2UgcHJpbnQgY2hlZWVlY2s6DQpgYGB7cn0NCnRhYmxlcyA8LSBkYXRhLmZyYW1lKHRhYmxlbmFtZSA9IGMoImhhc2NvbGxlZ2VfYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzY29sbGVnZV9rZnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzY29sbGVnZV90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXNjb2xsZWdlX3doaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5jb2xsZWdlX2JsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5jb2xsZWdlX2tmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuY29sbGVnZV90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuY29sbGVnZV93aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWxpdGVfYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVsaXRlX2tmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWxpdGVfdG9wMjAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVsaXRlX3doaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5mb3VyeXJfYmxhY2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmZvdXJ5cl9rZnIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmZvdXJ5cl90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZm91cnlyX3doaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5mb3VyeXJwcml2X2JsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5mb3VyeXJwcml2X2tmciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZm91cnlycHJpdl90b3AyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZm91cnlycHJpdl93aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJucHViX2JsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5wdWJfa2ZyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5wdWJfdG9wMjAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnB1Yl93aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdW1zdGF0cyIpLA0KICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSA9IGMoIkM6XFxcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxoYXNjb2xsZWdlX2JsYWNrLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxoYXNjb2xsZWdlX2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcaGFzY29sbGVnZV90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcaGFzY29sbGVnZV93aGl0ZS5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmNvbGxlZ2VfYmxhY2sucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5jb2xsZWdlX2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmNvbGxlZ2VfdG9wMjAucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5jb2xsZWdlX3doaXRlLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZWxpdGVfYmxhY2sucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5lbGl0ZV9rZnIucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5lbGl0ZV90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmVsaXRlX3doaXRlLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZm91cnlyX2JsYWNrLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxuZm91cnlyX2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cl90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cl93aGl0ZS5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cnByaXZfYmxhY2sucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5mb3VyeXJwcml2X2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbmZvdXJ5cnByaXZfdG9wMjAucG5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcVXNlcnNcXG5lcmlzXFxPbmVEcml2ZSAtIE1pZGRsZWJ1cnkgQ29sbGVnZVxcTGFzdCBTZW1lc3RlclxcRUNPTiBJbmVxdWFsaXR5ICYgSnVzdGljZVxcZWNvbjA0MDFcXG5mb3VyeXJwcml2X3doaXRlLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxucHViX2JsYWNrLnBuZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzpcXFVzZXJzXFxuZXJpc1xcT25lRHJpdmUgLSBNaWRkbGVidXJ5IENvbGxlZ2VcXExhc3QgU2VtZXN0ZXJcXEVDT04gSW5lcXVhbGl0eSAmIEp1c3RpY2VcXGVjb24wNDAxXFxucHViX2tmci5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbnB1Yl90b3AyMC5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcbnB1Yl93aGl0ZS5wbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkM6XFxVc2Vyc1xcbmVyaXNcXE9uZURyaXZlIC0gTWlkZGxlYnVyeSBDb2xsZWdlXFxMYXN0IFNlbWVzdGVyXFxFQ09OIEluZXF1YWxpdHkgJiBKdXN0aWNlXFxlY29uMDQwMVxcc3Vtc3RhdHMucG5nIikpDQp0YWJsZXMkdGFibGVuYW1lIDwtIGFzLmNoYXJhY3Rlcih0YWJsZXMkdGFibGVuYW1lKQ0KdGFibGVzJHBpY3R1cmUgPC0gYXMuY2hhcmFjdGVyKHRhYmxlcyRwaWN0dXJlKQ0KDQojIHdyaXRlX2Nzdih0YWJsZXMsICJvdXRwdXR0YWJsZXMuY3N2IikNCg0KdGFibGVzICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGdlb21faW1hZ2UoYWVzKGltYWdlID0gcGljdHVyZSksDQogICAgICAgICAgICAgc2l6ZSA9IC4yKQ0KYGBgDQoNCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLg0K